#include <graphics.h>  
#include <conio.h>
#include <stdio.h>
int main()
{
	float width,height,gravity; // 游戏画面大小、重力加速度
	float ball_x,ball_y,ball_vy,radius; // 小球圆心坐标、y方向速度、半径大小
	float rect_left_x1,rect_top_y1,rect_width1,rect_height1,rect_left_x2,rect_top_y2,rect_width2,rect_height2,rect_vx; // 方块障碍物的相关参数
	int score = 0; // 得分
	width = 600;  // 游戏画面宽度
	height = 600; // 游戏画面高度
	gravity = 0.6;  // 重力加速度
	initgraph(width, height); // 新建一个画布
	radius = 20; // 小球半径	
	ball_x = width/4; // 小球x位置
	ball_y = height/2;  // 小球y位置
	ball_vy = 0;  // 小球初始y速度为0
	rect_height1 = 190; // 方块1高度
	rect_width1 = 20; // 方块1宽度
	rect_left_x1 = width*3/4; // 方块1左边x坐标
	rect_top_y1 = height - rect_height1; // 方块1顶部y坐标
	rect_vx = -3; // 方块x方向速度
	rect_height2 = height-220-rect_height1; // 方块2高度
	rect_width2 = 20; // 方块2宽度
	rect_left_x2 = width*3/4; // 方块2左边x坐标
	rect_top_y2 =0; // 方块2顶部y坐标
	fillcircle(ball_x, ball_y, radius);  // 绘制小球
	// 画方块
	fillrectangle(rect_left_x1, height - rect_height1, rect_left_x1 + rect_width1,height);
	fillrectangle(rect_left_x2, rect_top_y2 , rect_left_x2 + rect_width2,rect_height2);
	TCHAR x[20]; // 定义字符串数组
	_stprintf(x, _T("按下空格键开始游戏")); 
	settextstyle(25, 0, _T("宋体")); // 设置文字大小、字体
	outtextxy(300, 300, x); // 输出得分文字
	char input = _getch(); // 获得输入字符
	if (input==' ') // 当按下空格键
	{
		ball_vy = -13;
		while(1) // 一直循环
		{		
			if (kbhit()) // 当按键时
			{
				char input = _getch(); // 获得输入字符
				if (input==' ') // 当按下空格键
					ball_vy = -13; // 给小球一个向上的速度
			}
			ball_vy = ball_vy + gravity;  // 根据重力加速度更新小球y方向速度
			ball_y = ball_y + ball_vy;    // 根据小球y方向速度更新其y坐标
			if (ball_y >= height-radius)  // 如果小球落到地面上
			{
				ball_vy = 0;  // y速度为0
				ball_y = height-radius;  // 规范其y坐标，避免落到地面下
			}
			rect_left_x1 = rect_left_x1 + rect_vx;
			rect_left_x2 = rect_left_x2 + rect_vx;// 方块向左移
			if (rect_left_x1 <= 0) // 如果方块跑到最左边
			{
				rect_left_x1 = width; 
				rect_left_x2 = width;// 在最右边重新出现
				score = score + 1; // 得分+1
				rect_height1 = rand() % int(height/4) + height/4; 
				rect_height2 = height-220-rect_height1;// 设置随机高度
				rect_vx = rand()/float(RAND_MAX) *4 - 7; // 设置方块随机速度
			}
			// 如果小球碰到方块
			if (((rect_left_x1 <= ball_x + radius) 
				&& (rect_left_x1 + rect_width1 >= ball_x - radius) 
				&& ((height - rect_height1 <= ball_y + radius)||(rect_height2>= ball_y - radius)))
				||(ball_y - radius<=0)
				||(ball_y + radius>=height))
			{
				cleardevice();  // 清空画面
				break;
			}
			cleardevice();  // 清空画面
			fillcircle(ball_x, ball_y, radius);  // 绘制小球
			// 画方块
			fillrectangle(rect_left_x1, height - rect_height1, rect_left_x1 + rect_width1,height);
			fillrectangle(rect_left_x2, rect_top_y2 , rect_left_x2 + rect_width2,rect_height2);
			TCHAR s[20]; // 定义字符串数组
			_stprintf(s, _T("%d"),  score); // 将score转换为字符串
			settextstyle(40, 0, _T("宋体")); // 设置文字大小、字体
			outtextxy(50, 30, s); // 输出得分文字
			Sleep(10);  // 暂停10毫秒
		}
	}
	Sleep(100);
	TCHAR y[20]; // 定义字符串数组
	_stprintf(y, _T("GAME OVER")); 
	settextstyle(60, 0, _T("宋体")); // 设置文字大小、字体
	outtextxy(160, 200, y); // 输出得分文字
	TCHAR s[20]; // 定义字符串数组
	_stprintf(s, _T("最终得分：%d"),  score); // 将score转换为字符串
	settextstyle(30, 0, _T("宋体")); // 设置文字大小、字体
	outtextxy(200, 320, s); // 输出得分文字
	_getch();
	return 0;
}